package com.yanqu.road.entity.activity.daomu.util;

import java.math.BigDecimal;

/**
 * 盗墓计算工具
 */
public class DaoMuSkillUtil {

    /**
     * 计算伤害
     * @param mySkillAttRate 技能伤害千分比
     * @param myAttValue 攻击方攻击力
     * @param myHarmAddRate 攻击方攻击伤害加成千分比
     * @param myReDefendRate 攻击方破甲千分比
     * @param myCriticalValue 攻击方暴击倍数千分表
     * @param targetDefendValue 对方防御力
     * @param targetNotHarmRate 对方伤害减免千分比
     * @return
     */
    public static long countSkillHurt(long mySkillAttRate, BigDecimal myAttValue, BigDecimal myHarmAddRate, long myReDefendRate, BigDecimal myCriticalValue, boolean criticalFlag,
                                      BigDecimal targetDefendValue, BigDecimal targetNotHarmRate) {
        //计算攻击力
        BigDecimal attVale = getAttVale(mySkillAttRate, myAttValue);
//        System.out.println("盗墓笔记PVE伤害。辅助技能计算后的攻击力：" + myAttValue);
//        System.out.println("盗墓笔记PVE伤害。技能加成千分比：" + mySkillAttRate);
//        System.out.println("盗墓笔记PVE伤害。1。攻击 = 辅助技能计算后的攻击力 * (技能加成千分比 / 1000)：" + attVale);
        //计算防御力
        BigDecimal defendVale = getDefendVale(targetDefendValue, myReDefendRate);
//        System.out.println("盗墓笔记PVE伤害。基础防御：" + targetDefendValue);
//        System.out.println("盗墓笔记PVE伤害。破甲千分比：" + myReDefendRate);
//        System.out.println("盗墓笔记PVE伤害。2。防御 = 基础防御 * （1000 - 破甲率）/ 1000：" + defendVale);
        //攻击 - 防御
        BigDecimal reHp = attVale.subtract(defendVale);
        //暴击伤害
        BigDecimal criticalAddRate = BigDecimal.ONE;
        if (criticalFlag) {
            criticalAddRate = (myCriticalValue.add(BigDecimal.valueOf(1000))).divide(BigDecimal.valueOf(1000));
        }
//        System.out.println("盗墓笔记PVE伤害。是否暴击：" + criticalFlag);
//        System.out.println("盗墓笔记PVE伤害。暴击伤害千分比：" + myCriticalValue);
//        System.out.println("盗墓笔记PVE伤害。1。暴击伤害加成 = （暴击伤害千分比 + 1000）/ 1000：" + criticalAddRate);
        //伤害加成率
//        System.out.println("盗墓笔记PVE伤害。1。伤害加成千分比：" + myHarmAddRate);
//        System.out.println("盗墓笔记PVE伤害。2。伤害减免千分比：" + targetNotHarmRate);
        BigDecimal harmRate = (BigDecimal.valueOf(1000).add(myHarmAddRate).subtract(targetNotHarmRate)).divide(BigDecimal.valueOf(1000));
        //伤害=(攻击 - 防御) * (1 - 伤害减免 + 伤害加成) * (1 + 暴击伤害)
        reHp = reHp.multiply(harmRate).multiply(criticalAddRate);
        //判断最终伤害是否大于1,比1小，取1
        reHp = reHp.compareTo(BigDecimal.ONE) >= 0 ? reHp : BigDecimal.ONE;
//        System.out.println("盗墓笔记PVE伤害。最终伤害 =（1攻击 - 2防御）* ((1000 + 1伤害加成千分比 - 2伤害减免千分比) / 1000) * 暴击伤害加成：" + reHp);
        return reHp.longValue();
    }

    /**
     * 计算攻击伤害
     * @param skillAttRate 技能伤害千分比
     * @param baseAttValue 基础攻击伤害
     * @return
     */
    private static BigDecimal getAttVale(long skillAttRate, BigDecimal baseAttValue) {
        BigDecimal skillAttRateBig = BigDecimal.valueOf(skillAttRate).divide(BigDecimal.valueOf(1000));
        //计算攻击力
        return baseAttValue.multiply(skillAttRateBig);
    }

    /**
     * 计算防御力
     * @param targetDefendValue
     * @param myReDefendRate
     * @return
     */
    private static BigDecimal getDefendVale(BigDecimal targetDefendValue, long myReDefendRate) {
        //防御 = 防御 * （1 - 破甲率）
        BigDecimal thousand = BigDecimal.valueOf(1000);
        BigDecimal myReDefendRateBig = BigDecimal.valueOf(1000 - myReDefendRate).divide(thousand);
        BigDecimal defendFinalValue = targetDefendValue.multiply(myReDefendRateBig);
        if (defendFinalValue.compareTo(BigDecimal.ZERO) <= 0) {
            return BigDecimal.ZERO;
        } else {
            return defendFinalValue;
        }
    }

}
